#include "looplink.h"

//创建
loopLink *list_create()
{
	loopLink *L=(loopLink*)malloc(sizeof(loopLink));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}

	//初始化
	L->len=0;
	L->next=L;
	//printf("创建成功\n");
	return L;
}

//判空
int list_empty(loopLink *L)
{
	return L->next==L?1:0;//1表示空，0表示非空
}

//尾插
int list_insert_tail(loopLink *L,datatype e)
{
	//判断逻辑
	if(NULL==L)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	//申请结点存放数据
	loopLink *p=(loopLink*)malloc(sizeof(loopLink));
	if(NULL==p)
	{
		printf("结点申请失败\n");
		return -2;
	}
	p->data=e;
	p->next=NULL;
	//定义遍历指针定位到最后一个结点
	loopLink *q=L;
	while(q->next!=L)
	{
		q=q->next;
	}
	//插入逻辑
	p->next=L;
	q->next=p;
	//表的变化
	L->len++;
	//printf("插入成功\n");
	return 0;
}
//带头结点遍历
void list_show(loopLink *L)
{
	//判断逻辑
	if(NULL==L||list_empty(L))
	{
		printf("遍历失败\n");
		return;
	}
	//遍历失败
	printf("链表元素分别是：");
	loopLink *q=L->next;
	while(q!=L)
	{
		printf("%d\t",q->data);
		q=q->next;
	}

	printf("\n");
}
//尾删
int list_delete_tail(loopLink *L)
{
	//判断逻辑
	if(NULL==L||list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}
	//定义遍历指针
	loopLink *q=L;
	while(q->next->next!=L)
	{
		q=q->next;
	}
	//删除逻辑
	free(q->next);
	q->next=L;
	L->len--;
	printf("删除成功\n");
	return 0;
}
//删头
loopLink *delete_head(loopLink *L)
{
	//判断逻辑
	if(NULL==L||list_empty(L))
	{
		printf("删除失败\n");
		return NULL;
	}
	//定义遍历指针定位到最后一个结点
	loopLink *q=L->next;
	while(q->next!=L)
	{
		q=q->next;
	}
	//孤立头结点
	q->next=L->next;
	//删除头结点
	free(L);
	L=NULL;
	//返回第一个结点的地址
	return q->next;
}
//删除头结点后的遍历
void list_show2(loopLink *S)
{
	//判断逻辑
	if(NULL==S)
	{
		printf("遍历失败\n");
	}
	//遍历失败
	printf("链表元素分别是：");
	loopLink *q=S;
	do
	{
		printf("%d\t",q->data);
		q=q->next;
	}while(q!=S);
	printf("\n");
}

//约瑟夫环
void circle(loopLink *L,int m)
{
	loopLink *p=L;         //p指向头结点
	loopLink *q=L;         
	while(q->next!=L)
	{
		q=q->next;         //q指向头结点L的前一个结点
	}
	int count=0;           //计数
	while(p!=q)          //结点大于1个
	{
		count++;
		if(count==m)
		{
			printf("%d  ",p->data);
			count=0;
			q->next=p->next;
			free(p);
			p=q->next;
		}
		else
		{
			p=p->next;
			q=q->next;
		}
	}
	printf("%d  \n",p->data);
	free(p);
	p=NULL;
	q=NULL;
}
